<?php

/**
 * Controlador de servicio.
 * Su función es proveer de metodos para usar el modulo de documentación de forma
 * abstracta sin depender de las vista, excepto al crear o editar plantillas.
 *
 * @author Israel Mora e Ismael Garcia
 */

include_once (realpath(dirname(__FILE__)) . '/../modelos/template.class.php');
include_once (realpath(dirname(__FILE__)) . '/../modelos/doc.class.php');
include_once (realpath(dirname(__FILE__)) . '/../modelos/label.class.php');
include_once (realpath(dirname(__FILE__)) . '/../modelos/asign.class.php');
include_once (realpath(dirname(__FILE__)) . '/../modelos/plantilla.class.php');

class controlDocumentacion {

    private $_template;
    private $_doc;
    private $_label;
    private $_capa;
    private $_asign;
    private $_asignP;
    
    /**
     * Constructor de la clase.
     * Ha de ser invocado como un nuevo objeto
     * El parametro opcional de capa, es la capa donde quiere que se carguen los editores de plantilla.
     * @param String $capa capa objetivo, por defecto 'principal'
     */
    public function __construct($capa = 'principal') {
        $this->_capa = $capa;
        $this->_template = new Template();
        $this->_doc = new Doc();
        $this->_label = new Label();
        $this->_asign = new Asign();
        $this->_asignP = new Plantilla();
    }

    /**
     * Invoca el editor de plantillas, se le ha de pasar como parametro un array que
     * sea asociativo. Este metodo pone los campos facilitados en el editor como
     * insertables.
     * @param Array $data array asociativo con los campos a insertar
     */
    public function newTemplate($data) {
        $capa = $this->_capa;
        $fila = $this->_template->listRecords();
        $campos = array_keys($data);
        $action = "new";
        $script = 'controladores/control_template.class.php?&action=insert';
        include (realpath(dirname(__FILE__)) . '/../vistas/template_editor.php');
    }

    /**
     * Se ha de pasar como parametro la plantilla a editar y opcionalmente un array
     * asociativo con los campos que queramos esten disponibles para usar. 
     * @param Int $id id de la plantilla a editar
     * @param Array $data array asociativo con los campos a insertar
     */
    public function editTemplate($id, $data = null) {

        if ($data == null) {
            $data["nom"] = 1;
        }
        $capa = $this->_capa;
        $fila = $this->_template->getRecord($id);
        $campos = array_keys($data);
        $action = "edit";
        $script = 'controladores/control_template.class.php?action=update&id=' . $id;
        include (realpath(dirname(__FILE__)) . '/../vistas/template_editor.php');
    }

    /**
     * Devuelve un array asociativo con todos los templates disponibles.
     */
    public function getTemplateList() {
        $lista = $this->_template->listRecords();
        return $lista;
    }

    /**
     * Devuelve el registo de la plantilla que pasada como parametro
     * @param Int $id id de la plantila
     * @return Array datos de la plantilla 
     */
    public function getTamplate($id) {
        $template = $this->_template->getRecord($id);
        return $template;
    }

    /**
     * Funcion que al pasarle el id de una etiqueta, devuelve un array con los documentos
     * que estan etiquetados con ella.
     * @param Int $id id de la etiqueta por la que filtrar
     * @return Array lista de plantillas filtrada
     */
    public function getTemplateListByLabel($id) {
        $where = "id_classificacio='" . $id . "'";
        $res = $this->_asignP->listRecords($where);
        $ids = $res[0]['id_document'];
        for ($i = 1; $i < count($res); $i++) {
            $ids = $ids . "," . $res[$i]['id_document'];
        }
        $where = "id IN (" . $ids . ')';
        $lista = $this->_template->listRecords($where);
        return $lista;
    }

    /**
     * Función el cual recibe un array asociativo multiple con datos y el id de la plantilla elegida
     * y devuelve el texto convertido en un nuevo campo dentro del array, llamado texto
     * @param Int $id id plantilla
     * @param Array $data array multiple de los campos a sustituir
     * @return Array array $data con el campos 'texto' con el resultado 
     */
    public function getMultiTemplateText($id, $data) {
        $template = $this->getTamplate($id);
        $temp = "";
        for ($i = 0; $i < count($data); $i++) {
            foreach ($data[$i] as $key => $value) {
                $template = str_replace('{' . $key . '}', $value, $template);
                
            }
            $data[$i]["texto"] = $template;
            $template = $this->getTamplate($id);
        }
        return $data;
    }
    
     /**
     * Función el cual recive un array asociativo simple con datos y el id de la plantilla elegida
     * y devuelve el texto convertido en un nuevo campo dentro del array, llamado texto
     * @param Int $id id plantilla
     * @param Array $data array de los campos a sustituir
     * @return type array $data con el campos 'texto' con el resultado 
     */
    public function getTemplateText($id, $data) {
        $template = $this->getTamplate($id);

        foreach ($data as $key => $value) {
            echo(" val: " . $value . " key: " . $key);
             $template = str_replace('{' . $key . '}', $value, $template);
             $data['texto'] = $template;
        }
        return $data;
    }

    /**
     * Devuelve la lista de documentos
     * @return Array documentos
     */
    public function getDocList() {
        $lista = $this->_doc->listRecords();
        return $lista;
    }

    /**
     * Devuelve la información del documento con la id especificada
     * @param Int $id
     * @return Array documento 
     */
    public function getDoc($id) {
        $doc = $this->_doc->getRecord($id);
        return $doc;
    }
    
    /**
     * Funcion que devuelve la lista de documentos en función de si estan aprobados o no
     * El parametro ha de ser 1 o 0
     * 1 = documentos aprobados
     * 0 = documentos no aprobados
     * @param Int $aprobado booleano 1 = aprobado, 0 = no aprobado
     * @return Array lista de documentos filtrados
     */
    public function getDocListByAprobado($aprobado){
        $where = "aprobado='" . $aprobado ."'";
        $lista = $this->_doc->listRecords($where);
        return $lista;
    }

    /**
     * Función que al pasarle el id de una etiqueta, devuelve un array con los documentos
     * que estan etiquetados con ella.
     * @param Int $id id de la etiqueta por la que filtrar
     * @return Array lista de documentos filtrados
     */
    public function getDocListByLabel($id) {
        $where = "id_classificacio='" . $id . "'";
        $res = $this->_asign->listRecords($where);
        $ids = $res[0]['id_document'];
        for ($i = 1; $i < count($res); $i++) {
            $ids = $ids . "," . $res[$i]['id_document'];
        }
        $where = "id IN (" . $ids . ')';
        $lista = $this->_doc->listRecords($where);
        return $lista;
    }

    /**
     * Descarga el fichero con el id especificado
     * @param Int $id id del documento a descargar
     */
    public function downloadDoc($id) {
        $this->_doc->getFile($this->_doc->getRecord($id));
    }
    
    /**
     * Devuelve la lista de labels (etiquetas) disponibles;
     * @return Array lista de etiquetas
     */
    public function getLabelList() {
        $lista = $this->_label->listRecords();
        return $lista;
    }
    
    /**
     * Devuelve la etiqueta que se le pida
     * @param Int $id id de la etiqueta
     * @return Array datos de la etiqueta
     */
    public function getLabel($id) {
        $label = $this->_label->getRecord($id);
        return $label;
    }
    
    /**
     * Función que coge como parametro cualquier cadena en formato HTML y la pasa
     * a texto plano
     * @param String $str texto en formato HTML
     * @return String texto plano
     */
    public function htmlToText($str){
        $text = strip_tags($str);
        return $text;
    }

}
?>
